package com.javatip.project.main.controller;

/**
 * @author 54716
 * @DATE 2024/5/24 15:05
 */

import com.javatip.project.deep_learning.app01Dataset.domain.App01Dataset;
import com.javatip.project.deep_learning.model.domain.Model;
import com.javatip.project.deep_learning.model.service.IModelService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.javatip.project.deep_learning.app01Dataset.service.IApp01DatasetService;
import oshi.SystemInfo;
import oshi.hardware.*;

import static com.javatip.common.utils.security.ShiroUtils.getSysUser;

@RestController
public class MainController {
    @Autowired
    private IApp01DatasetService app01DatasetService;

    @Autowired
    private IModelService modelService;


//    @PostMapping("/upload")
//    public String handleUploadRequest(MultipartHttpServletRequest request) {
//        List<MultipartFile> files = request.getFiles("files");
//        String folderName = request.getParameter("fileName"); // 获取文件夹名称
////        String destinationPath = "/home/jolly/develop/project/java/xx-system/src/main/resources/dataset"; // 指定保存文件的目标路径
//        String destinationPath = "/home/jolly/develop/project/java/xx-system/src/main/resources/dataset"; // 指定保存文件的目标路径
        String destinationPath = "src/main/resources/dataset"; // 指定保存文件的目标路径
//
//        App01Dataset dataset = app01DatasetService.selectApp01DatasetByName(folderName);
//        if (dataset == null) {
//            // 如果名称不存在，则创建新记录
//            dataset = new App01Dataset();
//            dataset.setName(folderName);
//            dataset.setUserId(2); // 设置默认用户ID为2
//            dataset.setLocation(destinationPath + "/" + folderName); // 设置路径
//            // 保存到数据库
//            app01DatasetService.insertApp01Dataset(dataset);
//        }
//        if (files != null && !files.isEmpty() && folderName != null && !folderName.isEmpty()) {
//            try {
////                String destinationPath = "/home/jolly/develop/project/java/xx-system/src/main/resources/dataset"; // 指定保存文件的目标路径
//                File destinationDir = new File(destinationPath, folderName); // 创建文件夹路径
//                if (!destinationDir.exists()) {
//                    destinationDir.mkdirs(); // 创建文件夹
//                }
//
//                File imageDir = new File(destinationDir, "train"); // 创建image文件夹路径
//                if (!imageDir.exists()) {
//                    imageDir.mkdirs(); // 创建train文件夹
//                }
//
//                imageDir = new File(destinationDir + "/train", "image"); // 创建image文件夹路径
//                if (!imageDir.exists()) {
//                    imageDir.mkdirs(); // 创建image文件夹
//                }
//
//                for (MultipartFile file : files) {
//                    // 保存文件到指定位置
//                    file.transferTo(new File(imageDir, file.getOriginalFilename())); // 复制文件到image文件夹
//                }
//
//                return "文件上传成功";
//            } catch (IOException e) {
//                e.printStackTrace();
//                return "文件上传失败";
//            }
//        } else {
//            return "未选择文件或文件夹名为空";
//        }
//    }

//    @PostMapping("/uploadMask")
//    public String handleUploadMaskRequest(MultipartHttpServletRequest request) {
//        List<MultipartFile> files = request.getFiles("files");
//        String folderName = request.getParameter("fileName"); // 获取文件夹名称
//        String destinationPath = "/home/jolly/develop/project/java/xx-system/src/main/resources/dataset"; // 指定保存文件的目标路径
//
//        App01Dataset dataset = app01DatasetService.selectApp01DatasetByName(folderName);
//        if (dataset == null) {
//            // 如果名称不存在，则创建新记录
//            dataset = new App01Dataset();
//            dataset.setName(folderName);
//            dataset.setUserId(2); // 设置默认用户ID为2
//            dataset.setLocation(destinationPath + "/" + folderName); // 设置路径
//            // 保存到数据库
//            app01DatasetService.insertApp01Dataset(dataset);
//        }
//        if (files != null && !files.isEmpty() && folderName != null && !folderName.isEmpty()) {
//            try {
////                String destinationPath = "/home/jolly/develop/project/java/xx-system/src/main/resources/dataset"; // 指定保存文件的目标路径
//                File destinationDir = new File(destinationPath, folderName); // 创建文件夹路径
//                if (!destinationDir.exists()) {
//                    destinationDir.mkdirs(); // 创建文件夹
//                }
//
//                File imageDir = new File(destinationDir, "train"); // 创建image文件夹路径
//                if (!imageDir.exists()) {
//                    imageDir.mkdirs(); // 创建train文件夹
//                }
//                imageDir = new File(destinationDir + "/train", "label1"); // 创建image文件夹路径
//                if (!imageDir.exists()) {
//                    imageDir.mkdirs(); // 创建image文件夹
//                }
//
//                for (MultipartFile file : files) {
//                    // 保存文件到指定位置
//                    file.transferTo(new File(imageDir, file.getOriginalFilename())); // 复制文件到image文件夹
//                }
//
//                return "文件上传成功";
//            } catch (IOException e) {
//                e.printStackTrace();
//                return "文件上传失败";
//            }
//        } else {
//            return "未选择文件或文件夹名为空";
//        }
//    }

//    @PostMapping("/uploadVal")
//    public String handleUploadValRequest(MultipartHttpServletRequest request) {
//        List<MultipartFile> files = request.getFiles("files");
//        String folderName = request.getParameter("fileName"); // 获取文件夹名称
//        String destinationPath = "/home/jolly/develop/project/java/xx-system/src/main/resources/dataset"; // 指定保存文件的目标路径
//
//        App01Dataset dataset = app01DatasetService.selectApp01DatasetByName(folderName);
//        if (dataset == null) {
//            // 如果名称不存在，则创建新记录
//            dataset = new App01Dataset();
//            dataset.setName(folderName);
//            dataset.setUserId(2); // 设置默认用户ID为2
//            dataset.setLocation(destinationPath + "/" + folderName); // 设置路径
//            // 保存到数据库
//            app01DatasetService.insertApp01Dataset(dataset);
//        }
//        if (files != null && !files.isEmpty() && folderName != null && !folderName.isEmpty()) {
//            try {
////                String destinationPath = "/home/jolly/develop/project/java/xx-system/src/main/resources/dataset"; // 指定保存文件的目标路径
//                File destinationDir = new File(destinationPath, folderName); // 创建文件夹路径
//                if (!destinationDir.exists()) {
//                    destinationDir.mkdirs(); // 创建文件夹
//                }
//
//                File imageDir = new File(destinationDir, "val"); // 创建image文件夹路径
//                if (!imageDir.exists()) {
//                    imageDir.mkdirs(); // 创建train文件夹
//                }
//
//                imageDir = new File(destinationDir + "/val", "image"); // 创建image文件夹路径
//                if (!imageDir.exists()) {
//                    imageDir.mkdirs(); // 创建image文件夹
//                }
//
//                for (MultipartFile file : files) {
//                    // 保存文件到指定位置
//                    file.transferTo(new File(imageDir, file.getOriginalFilename())); // 复制文件到image文件夹
//                }
//
//                return "文件上传成功";
//            } catch (IOException e) {
//                e.printStackTrace();
//                return "文件上传失败";
//            }
//        } else {
//            return "未选择文件或文件夹名为空";
//        }
//    }

//    @PostMapping("/uploadValMask")
//    public String handleUploadValMaskRequest(MultipartHttpServletRequest request) {
//        List<MultipartFile> files = request.getFiles("files");
//        String folderName = request.getParameter("fileName"); // 获取文件夹名称
//        String destinationPath = "/home/jolly/develop/project/java/xx-system/src/main/resources/dataset"; // 指定保存文件的目标路径
//
//        App01Dataset dataset = app01DatasetService.selectApp01DatasetByName(folderName);
//        if (dataset == null) {
//            // 如果名称不存在，则创建新记录
//            dataset = new App01Dataset();
//            dataset.setName(folderName);
//            dataset.setUserId(2); // 设置默认用户ID为2
//            dataset.setLocation(destinationPath + "/" + folderName); // 设置路径
//            // 保存到数据库
//            app01DatasetService.insertApp01Dataset(dataset);
//        }
//        if (files != null && !files.isEmpty() && folderName != null && !folderName.isEmpty()) {
//            try {
////                String destinationPath = "/home/jolly/develop/project/java/xx-system/src/main/resources/dataset"; // 指定保存文件的目标路径
//                File destinationDir = new File(destinationPath, folderName); // 创建文件夹路径
//                if (!destinationDir.exists()) {
//                    destinationDir.mkdirs(); // 创建文件夹
//                }
//
//                File imageDir = new File(destinationDir, "val"); // 创建image文件夹路径
//                if (!imageDir.exists()) {
//                    imageDir.mkdirs(); // 创建train文件夹
//                }
//                imageDir = new File(destinationDir + "/val", "label1"); // 创建image文件夹路径
//                if (!imageDir.exists()) {
//                    imageDir.mkdirs(); // 创建image文件夹
//                }
//
//                for (MultipartFile file : files) {
//                    // 保存文件到指定位置
//                    file.transferTo(new File(imageDir, file.getOriginalFilename())); // 复制文件到image文件夹
//                }
//
//                return "文件上传成功";
//            } catch (IOException e) {
//                e.printStackTrace();
//                return "文件上传失败";
//            }
//        } else {
//            return "未选择文件或文件夹名为空";
//        }
//    }

//    处理上传模型文件
    @PostMapping("/uploadModel")
    public String handleUploadModelRequest(MultipartHttpServletRequest request) {
        System.out.println("uploadModel");

        // 获取文件
        List<MultipartFile> files = request.getFiles("file");
        if (files == null || files.isEmpty()) {
            return "未选择文件";
        }

        String folderName = request.getParameter("fileName"); // 获取文件夹名称
        if (folderName == null || folderName.isEmpty()) {
            return "文件夹名称为空";
        }

        String fileNames = files.get(0).getOriginalFilename();
        int lastIndex = fileNames.lastIndexOf('.');
        String fileNameWithoutExtension = (lastIndex != -1) ? fileNames.substring(0, lastIndex) : fileNames;
        System.out.println("文件名 (无扩展名): " + fileNameWithoutExtension);

        String destinationPath = "/home/jolly/develop/project/java/xx-system/src/main/resources/model"; // 指定保存文件的目标路径

        // 检查数据库中是否已有该文件名的记录
//        Model model = modelService.selectModelbyName(folderName);
//        if (model == null) {
//            // 如果名称不存在，则创建新记录
//            model = new Model();
//            model.setModelName(fileNameWithoutExtension);
//            model.setUserId(2); // 设置默认用户ID为2
//            model.setLocation(destinationPath + "/" + folderName + "/" + fileNameWithoutExtension); // 设置路径
//            // 保存到数据库
//            modelService.insertModel(model);
//        }

        // 确保文件列表和文件夹名不为空
        if (files != null && !files.isEmpty() && folderName != null && !folderName.isEmpty()) {
            try {
                // 创建目标目录
                File destinationDir = new File(destinationPath, folderName);
                if (!destinationDir.exists()) {
                    destinationDir.mkdirs();
                }

                for (MultipartFile file : files) {
                    // 保存文件到指定位置
                    file.transferTo(new File(destinationDir, file.getOriginalFilename()));
                }

                // 调用方法来更新 Network.py 文件
                String relativePath = getRelativePath(destinationDir.getPath(), destinationPath);
                appendPythonMethod(relativePath, fileNameWithoutExtension);

                return "文件上传成功";
            } catch (IOException e) {
                e.printStackTrace();
                return "文件上传失败: " + e.getMessage();
            }
        } else {
            return "未选择文件或文件夹名为空";
        }
    }

    // 获取相对路径
    private String getRelativePath(String fullPath, String basePath) {
        return new File(basePath).toURI().relativize(new File(fullPath).toURI()).getPath();
    }

    // 追加方法到 Network.py 文件
    private void appendPythonMethod(String relativePath, String fileNameWithoutExtension) {
        // 指定 Network.py 文件的路径
        String networkFilePath = "/home/jolly/develop/project/java/xx-system/src/main/resources/NetWork/Network.py";

        // 生成唯一模块名
        String moduleName = relativePath.replace(File.separator, "_").replace("/", "_")  + fileNameWithoutExtension;

        // 生成方法的代码
        String methodCode = String.format(
                "\ndef %s():\n" +
                        "    module = imported_modules['%s']\n" +
                        "    if hasattr(module, 'main'):\n" +
                        "        return module.main()  # 调用 main 函数\n" +
                        "    else:\n" +
                        "        raise ImportError('Module does not have a main function')\n",
                fileNameWithoutExtension, moduleName
        );

        // 追加方法代码到 Network.py
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(networkFilePath, true))) {
            writer.write(methodCode);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    @Autowired
    private ConsoleInterceptor consoleInterceptor;

    @GetMapping("/console")
    @ResponseBody
    public String getConsoleOutput() {
        // 在这里处理 IDEA 控制台的输出，并返回给客户端
        String consoleOutput = "sadasdasdasd";// 从你的日志文件或其他地方获取控制台输出
        consoleInterceptor.print();
        return consoleInterceptor.print();
    }


    private final SystemInfo systemInfo = new SystemInfo();

    @GetMapping("/api/system")
    public Map<String, Object> getSystemInfo() throws InterruptedException {
        HardwareAbstractionLayer hal = systemInfo.getHardware();

        CentralProcessor cpu = hal.getProcessor();
        GlobalMemory memory = hal.getMemory();
        List<GraphicsCard> gpus = hal.getGraphicsCards();
        Sensors sensors = hal.getSensors();

        Map<String, Object> systemInfoMap = new HashMap<>();

        // 获取CPU使用率快照
        long[] prevTicks = cpu.getSystemCpuLoadTicks();
        Thread.sleep(1000); // 等待1秒
        long[] ticks = cpu.getSystemCpuLoadTicks();
        double cpuLoad = cpu.getSystemCpuLoadBetweenTicks(prevTicks) * 100;
        systemInfoMap.put("cpuLoad", cpuLoad);

        // 获取内存使用情况
        long totalMemory = memory.getTotal();
        long availableMemory = memory.getAvailable();
        systemInfoMap.put("totalMemory", String.format("%.2f GB", bytesToGigabytes(totalMemory)));
        systemInfoMap.put("availableMemory", String.format("%.2f GB", bytesToGigabytes(availableMemory)));
        systemInfoMap.put("usedMemory", String.format("%.2f GB", bytesToGigabytes(totalMemory - availableMemory)));

        // 获取 GPU 信息
        if (!gpus.isEmpty()) {
            GraphicsCard gpu = gpus.get(0); // 假设只有一个 GPU
            systemInfoMap.put("gpuName", gpu.getName());
            systemInfoMap.put("gpuVendor", gpu.getVendor());
//            systemInfoMap.put("gpuVRAM", "22GB");

        } else {
            systemInfoMap.put("gpuName", "Unknown GPU");
            systemInfoMap.put("gpuVendor", "Unknown Vendor");
//            systemInfoMap.put("gpuVRAM", "Unknown VRAM");
        }

        try {
            Process process = Runtime.getRuntime().exec("nvidia-smi --query-gpu=memory.used,memory.total --format=csv,nounits,noheader");
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                String[] memoryInfo = line.trim().split(", ");
                if (memoryInfo.length == 2) {
                    double memoryUsed = Double.parseDouble(memoryInfo[0]);
                    double memoryTotal = Double.parseDouble(memoryInfo[1]);
//                    System.out.println("memoryUsed:"+memoryUsed);
//                    System.out.println("memoryTotal:"+memoryTotal);
                    systemInfoMap.put("gpuMemoryUsed", String.format("%.2f GB",memoryUsed/1024));
                    systemInfoMap.put("gpuMemoryTotal",String.format("%.2f GB",memoryTotal/1024));
                    // 计算显存利用率
                    double memoryUtilization = (memoryUsed / memoryTotal) * 100;
                    systemInfoMap.put("gpuMemoryUtilization", String.format("%.2f%%", memoryUtilization));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 获取系统温度
        double cpuTemperature = sensors.getCpuTemperature();
        systemInfoMap.put("cpuTemperature", cpuTemperature);

//        System.out.println(getSysUser().getUserId());
        return systemInfoMap;
    }

    // 辅助方法：将字节转换为 GB
    private double bytesToGigabytes(long bytes) {
        return bytes / 1_073_741_824.0; // 1 GB = 1024^3 bytes
    }


}



